假設:1~2億條數據需要緩存,請問如何設計這個存儲案例
單機單臺100%不可能,肯定是分布式存儲,用redis如何落地?
一般業界有3種解決方案。
解決方案
1.哈希取余分區
2億條記錄就是2億個k,v,我們單機不行必須要分布式多機,假設有3臺機器構成一個集群,用戶每次讀寫操作都是根據公式:
hash(key) % N個機器臺數,計算出哈希值,用來決定數據映射到哪一個節點上。
優點:
簡單粗暴,直接有效,只需要預估好數據規劃好節點,例如3臺、8臺、10臺,就能保證一段時間的數據支撐。使用Hash算法讓固定的一部分請求落到同一臺服務器上,這樣每臺服務器固定處理一部分請求(并維護這些請求的信息),起到負載均衡+分而治之的作用。
缺點:
原來規劃好的節點,進行擴容或者縮容就比較麻煩了額,不管擴縮,每次數據變動導致節點有變動,映射關系需要重新進行計算,在服務器個數固定不變時沒有問題,如果需要彈性擴容或故障停機的情況下,原來的取模公式就會發生變化:Hash(key)/3會變成Hash(key) /?。此時地址經過取余運算的結果將發生很大變化,根據公式獲取的服務器也會變得不可控。
某個redis機器宕機了,由于臺數數量變化,會導致hash取余全部數據重新洗牌。
?